package com.example.springbootrediscache.service;

import com.example.springbootrediscache.entity.User;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 *
 */
@CacheConfig(cacheNames = "user")
@Service
public class SpEL上下文数据 {
    /**
     * SpEL提供了多种运算符
     * 关系	<，>，<=，>=，==，!=，lt，gt，le，ge，eq，ne
     * 算术	+，- ，* ，/，%，^
     * 逻辑	&&，||，!，and，or，not，between，instanceof
     * 条件	?: (ternary)，?: (elvis)
     * 正则表达式	matches
     * 其他类型	?.，?[…]，![…]，^[…]，$[…]
     */

    @Cacheable(key = "#root.methodname")
    public void 当前被调用的方法名() {
    }

    @Cacheable(key = "#root.method.name")
    public void 当前被调用的方法() {
    }

    @Cacheable(key = "#root.target")
    public void 当前被调用的目标对象实例() {
    }

    @Cacheable(key = "#root.targetClass")
    public void 当前被调用的目标对象的类() {
    }

    @Cacheable(key = "#root.args[0]")
    public void 当前被调用的方法的参数列表(int id) {
    }

    @Cacheable(key = "#root.caches[0].name")
    public void 当前方法调用使用的缓存列表(int id) {
    }

    /**
     * 如findArtisan(User user),可以通过#user.id获得参数
     */
    @Cacheable(key = "#user.id")
    public void 当前被调用的方法的参数(User user) {
    }

    /**
     * 仅当方法执行后的判断有效，如 unless cacheEvict的beforeInvocation=false
     */
    @Cacheable(key = "#result")
    public void 方法执行后的返回值(User user) {
    }

}
